To Do
- Why is CMS_20 empty?
- Double check that CMS_41 is yes/no
library(stringr)
library(tidyverse)
library(data.table)
ConnectCalls <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/ConnectCalls.csv", na.strings = "")
colnames(ConnectCalls) <- c("EncounterID",
"LastStatus",
"UpdatedOn",
"AQ1", "AQ1_Date",
"AQ2", "AQ2_Date",
"AQ3", "AQ3_Date",
"AQ4", "AQ4_Date",
"AQ5", "AQ5_Date",
"AQ6", "AQ6_Date",
"AQ7", "AQ7_Date",
"AQ8", "AQ8_Date",
"AQ9", "AQ9_Date",
"AQ10", "AQ10_Date",
"AQ11", "AQ11_Date",
"AQ12", "AQ12_Date",
"AQ13", "AQ13_Date",
"AQ14", "AQ14_Date",
"AQ15", "AQ15_Date",
"AQ16", "AQ16_Date",
"AQ17", "AQ17_Date",
"AQ18", "AQ18_Date",
"AQ19", "AQ19_Date",
"AQ20", "AQ20_Date",
"AQ21", "AQ21_Date",
"AQ22", "AQ22_Date",
"AQ23", "AQ23_Date",
"AQ24", "AQ24_Date")
factorCols <- c("EncounterID", "LastStatus",
names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}$"])
ConnectCalls[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]
dateCols <- c("UpdatedOn",
names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}_Date"])
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
ConnectCalls[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]
head(ConnectCalls)
aqCols <- c("EncounterID", "LastStatus", "UpdatedOn",
names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}$"])
ConnectLongerAQ <- melt.data.table(ConnectCalls[!is.na(EncounterID), ..aqCols],
measure.vars = paste0("AQ", 1:24),
variable.name = "AQ_Number",
value.name = "AQ_Value")
aqCols <- c("EncounterID", "LastStatus", "UpdatedOn",
names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}_Date"])
ConnectLongerAQDate <- melt.data.table(ConnectCalls[!is.na(EncounterID), ..aqCols],
measure.vars = paste0("AQ", 1:24, "_Date"),
variable.name = "AQ_Number",
value.name = "AQ_Date")
ConnectLongerAQDate[, AQ_Number := str_replace(AQ_Number, "_Date", "")]
ConnectLonger <- merge(ConnectLongerAQ, ConnectLongerAQDate)[!is.na(AQ_Value)]
rm(ConnectLongerAQ, ConnectLongerAQDate)
head(ConnectLonger)
ConnectLonger[, .N, by = "AQ_Value"][order(desc(N))] %>%
ggplot(aes(x = AQ_Value, y = N, label = N)) +
geom_col(fill = "lightblue") +
geom_text(size = 5, position = position_stack(vjust = 0.5)) +
theme(axis.text.x = element_text(angle = 90))

Surveys <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/Surveys.csv", na.strings = "")
factorCols <- c(names(Surveys)[! names(Surveys) %in% c("AdmitDate",
"CMS_Reportable",
"MortalityFlag")])
Surveys[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]
dateCols <- c("AdmitDate")
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
Surveys[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]
Surveys$CMS_Reportable <- ifelse(Surveys$CMS_Reportable == "Yes", TRUE, FALSE)
Surveys$MortalityFlag <- ifelse(Surveys$MortalityFlag == "Y", TRUE, FALSE)
logicalCols <- c("CMS_12", "CMS_18", "CMS_21")
logicalFun <- function(x) ifelse(x == 1, TRUE, FALSE)
Surveys[, (logicalCols) := lapply(.SD, logicalFun), .SDcols = logicalCols]
Surveys <- Surveys[, -c("CMS_42", "CMS_43", "CMS_44")]
head(Surveys)
cmsCols <- c("SurveyID",
names(Surveys)[names(Surveys) %like% "CMS_[0-9]{1,2}$"])
SurveysLonger <- melt.data.table(Surveys[!is.na(SurveyID), ..cmsCols],
measure.vars = paste0("CMS_", c(1:3, 6:8, 10:13,
18:28, 30, 33:34,
37:41)),
variable.name = "CMS_Number",
value.name = "CMS_Response")[!is.na(CMS_Response)]
Warning in melt.data.table(Surveys[!is.na(SurveyID), ..cmsCols], measure.vars = paste0("CMS_", :
'measure.vars' [CMS_1, CMS_2, CMS_3, CMS_6, ...] are not all of the same type. By order of hierarchy, the molten data value column will be of type 'character'. All measure variables not of type 'character' will be coerced too. Check DETAILS in ?melt.data.table for more on coercion.
SurveysLonger[!(CMS_Number %in% c("CMS_12", "CMS_18", "CMS_21", "CMS_23"))] %>%
.[, CMS_Response := as.factor(CMS_Response)] %>%
.[, .N, by = list(CMS_Number, CMS_Response)] %>%
ggplot(aes(x = CMS_Number, y = N, fill = factor(CMS_Response, levels = c(5:0)))) +
geom_bar(position = "fill", stat = "identity") +
theme(axis.text.x = element_text(angle = 90),
legend.title = element_blank())

SurveysLonger[(CMS_Number %in% c("CMS_12", "CMS_18", "CMS_21"))] %>%
.[, CMS_Response := as.factor(CMS_Response)] %>%
.[, .N, by = list(CMS_Number, CMS_Response)] %>%
ggplot(aes(x = CMS_Number, y = N, fill = CMS_Response)) +
geom_bar(position = "fill", stat = "identity") +
theme(axis.text.x = element_text(angle = 90),
legend.title = element_blank())

SurveysLonger[CMS_Number == "CMS_23"] %>%
.[, CMS_Response := as.factor(CMS_Response)] %>%
.[, .N, by = list(CMS_Number, CMS_Response)] %>%
ggplot(aes(x = CMS_Number, y = N, fill = factor(CMS_Response, levels = c(10:0)))) +
geom_bar(position = "fill", stat = "identity") +
theme(axis.text.x = element_text(angle = 90),
legend.title = element_blank())

Readmissions <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/Readmissions.csv", na.strings = "")
colnames(Readmissions) <- str_replace_all(names(Readmissions),
pattern = " ",
replacement = "")
factorCols <- c(names(Readmissions)[! names(Readmissions) %in% c("IndexDischDate",
"ReadmitDate",
"DaysBetweenAdmssions",
"ReadmitDischargeDate",
"ReadmitInfo.Age")])
Readmissions[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]
dateCols <- c("IndexDischDate", "ReadmitDate", "ReadmitDischargeDate")
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
Readmissions[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]
head(Readmissions)
Encounters <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/Encounters.csv", na.strings = "")
colnames(Encounters) <- str_replace_all(names(Encounters),
pattern = " ",
replacement = "")
factorCols <- c(names(Encounters)[! names(Encounters) %in% c("AdmitDate",
"DischargeDate",
"Age")])
Encounters[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]
dateCols <- c("AdmitDate", "DischargeDate")
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
Encounters[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]
Encounters[EncounterID %in% c("40347"), Age := 43]
Encounters[!(EncounterID %in% c("22924",
"34029",
"35544",
"44683",
"56159",
"68750")) | Age <= 110]
head(Encounters)
merge(Encounters,
merge(Surveys,
merge(ConnectCalls,
Readmissions,
by = "EncounterID"),
by = "EncounterID"),
by = "EncounterID")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBUbyBEbwotIFdoeSBpcyBDTVNfMjAgZW1wdHk/Ci0gRG91YmxlIGNoZWNrIHRoYXQgQ01TXzQxIGlzIHllcy9ubwoKCmBgYHtyfQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRhdGEudGFibGUpCmBgYAoKYGBge3J9CkNvbm5lY3RDYWxscyA8LSBmcmVhZCgiL1VzZXJzL2d1c2xpcGtpbi9Eb3dubG9hZHMvRmxvcmlkYSBQb2x5LSBTZW5pb3IgQ2Fwc3RvbmUgR3JvdXAvQ29ubmVjdENhbGxzLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKY29sbmFtZXMoQ29ubmVjdENhbGxzKSA8LSBjKCJFbmNvdW50ZXJJRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFzdFN0YXR1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXBkYXRlZE9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTEiLCAiQVExX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMiIsICJBUTJfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVEzIiwgIkFRM19EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTQiLCAiQVE0X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRNSIsICJBUTVfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVE2IiwgIkFRNl9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTciLCAiQVE3X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFROCIsICJBUThfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVE5IiwgIkFROV9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTEwIiwgIkFRMTBfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVExMSIsICJBUTExX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMTIiLCAiQVExMl9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTEzIiwgIkFRMTNfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVExNCIsICJBUTE0X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMTUiLCAiQVExNV9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTE2IiwgIkFRMTZfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVExNyIsICJBUTE3X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMTgiLCAiQVExOF9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTE5IiwgIkFRMTlfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVEyMCIsICJBUTIwX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMjEiLCAiQVEyMV9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTIyIiwgIkFRMjJfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVEyMyIsICJBUTIzX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMjQiLCAiQVEyNF9EYXRlIikKCmZhY3RvckNvbHMgPC0gYygiRW5jb3VudGVySUQiLCAiTGFzdFN0YXR1cyIsIAogICAgICAgICAgICAgICAgbmFtZXMoQ29ubmVjdENhbGxzKVtuYW1lcyhDb25uZWN0Q2FsbHMpICVsaWtlJSAiQVFbMC05XXsxLDJ9JCJdKQpDb25uZWN0Q2FsbHNbLCAoZmFjdG9yQ29scykgOj0gbGFwcGx5KC5TRCwgYXMuZmFjdG9yKSwgLlNEY29scyA9IGZhY3RvckNvbHNdCgpkYXRlQ29scyA8LSBjKCJVcGRhdGVkT24iLCAKICAgICAgICAgICAgICBuYW1lcyhDb25uZWN0Q2FsbHMpW25hbWVzKENvbm5lY3RDYWxscykgJWxpa2UlICJBUVswLTldezEsMn1fRGF0ZSJdKQpkYXRlRnVuIDwtIGZ1bmN0aW9uKHgpIGFzLkRhdGUoeCwgZm9ybWF0ID0gIiVtLyVkLyV5IikKQ29ubmVjdENhbGxzWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKaGVhZChDb25uZWN0Q2FsbHMpCmBgYAoKCmBgYHtyfQphcUNvbHMgPC0gYygiRW5jb3VudGVySUQiLCAiTGFzdFN0YXR1cyIsICJVcGRhdGVkT24iLAogICAgICAgICAgICBuYW1lcyhDb25uZWN0Q2FsbHMpW25hbWVzKENvbm5lY3RDYWxscykgJWxpa2UlICJBUVswLTldezEsMn0kIl0pCkNvbm5lY3RMb25nZXJBUSA8LSBtZWx0LmRhdGEudGFibGUoQ29ubmVjdENhbGxzWyFpcy5uYShFbmNvdW50ZXJJRCksIC4uYXFDb2xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJBUSIsIDE6MjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiQVFfTnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIkFRX1ZhbHVlIikKCmFxQ29scyA8LSBjKCJFbmNvdW50ZXJJRCIsICJMYXN0U3RhdHVzIiwgIlVwZGF0ZWRPbiIsCiAgbmFtZXMoQ29ubmVjdENhbGxzKVtuYW1lcyhDb25uZWN0Q2FsbHMpICVsaWtlJSAiQVFbMC05XXsxLDJ9X0RhdGUiXSkKQ29ubmVjdExvbmdlckFRRGF0ZSA8LSBtZWx0LmRhdGEudGFibGUoQ29ubmVjdENhbGxzWyFpcy5uYShFbmNvdW50ZXJJRCksIC4uYXFDb2xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJBUSIsIDE6MjQsICJfRGF0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gIkFRX051bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiQVFfRGF0ZSIpCgpDb25uZWN0TG9uZ2VyQVFEYXRlWywgQVFfTnVtYmVyIDo9IHN0cl9yZXBsYWNlKEFRX051bWJlciwgIl9EYXRlIiwgIiIpXQoKQ29ubmVjdExvbmdlciA8LSBtZXJnZShDb25uZWN0TG9uZ2VyQVEsIENvbm5lY3RMb25nZXJBUURhdGUpWyFpcy5uYShBUV9WYWx1ZSldCnJtKENvbm5lY3RMb25nZXJBUSwgQ29ubmVjdExvbmdlckFRRGF0ZSkKaGVhZChDb25uZWN0TG9uZ2VyKQoKQ29ubmVjdExvbmdlclssIC5OLCBieSA9ICJBUV9WYWx1ZSJdW29yZGVyKGRlc2MoTikpXSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBBUV9WYWx1ZSwgeSA9IE4sIGxhYmVsID0gTikpICsKICBnZW9tX2NvbChmaWxsID0gImxpZ2h0Ymx1ZSIpICsKICBnZW9tX3RleHQoc2l6ZSA9IDUsIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCmBgYAoKCmBgYHtyfQpTdXJ2ZXlzIDwtIGZyZWFkKCIvVXNlcnMvZ3VzbGlwa2luL0Rvd25sb2Fkcy9GbG9yaWRhIFBvbHktIFNlbmlvciBDYXBzdG9uZSBHcm91cC9TdXJ2ZXlzLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKCmZhY3RvckNvbHMgPC0gYyhuYW1lcyhTdXJ2ZXlzKVshIG5hbWVzKFN1cnZleXMpICVpbiUgYygiQWRtaXREYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDTVNfUmVwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9ydGFsaXR5RmxhZyIpXSkKU3VydmV5c1ssIChmYWN0b3JDb2xzKSA6PSBsYXBwbHkoLlNELCBhcy5mYWN0b3IpLCAuU0Rjb2xzID0gZmFjdG9yQ29sc10KCmRhdGVDb2xzIDwtIGMoIkFkbWl0RGF0ZSIpCmRhdGVGdW4gPC0gZnVuY3Rpb24oeCkgYXMuRGF0ZSh4LCBmb3JtYXQgPSAiJW0vJWQvJXkiKQpTdXJ2ZXlzWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKU3VydmV5cyRDTVNfUmVwb3J0YWJsZSA8LSBpZmVsc2UoU3VydmV5cyRDTVNfUmVwb3J0YWJsZSA9PSAiWWVzIiwgVFJVRSwgRkFMU0UpClN1cnZleXMkTW9ydGFsaXR5RmxhZyA8LSBpZmVsc2UoU3VydmV5cyRNb3J0YWxpdHlGbGFnID09ICJZIiwgVFJVRSwgRkFMU0UpCgpsb2dpY2FsQ29scyA8LSBjKCJDTVNfMTIiLCAiQ01TXzE4IiwgIkNNU18yMSIpCmxvZ2ljYWxGdW4gPC0gZnVuY3Rpb24oeCkgaWZlbHNlKHggPT0gMSwgVFJVRSwgRkFMU0UpClN1cnZleXNbLCAobG9naWNhbENvbHMpIDo9IGxhcHBseSguU0QsIGxvZ2ljYWxGdW4pLCAuU0Rjb2xzID0gbG9naWNhbENvbHNdClN1cnZleXMgPC0gU3VydmV5c1ssIC1jKCJDTVNfNDIiLCAiQ01TXzQzIiwgIkNNU180NCIpXQoKaGVhZChTdXJ2ZXlzKQpgYGAKCmBgYHtyfQpjbXNDb2xzIDwtIGMoIlN1cnZleUlEIiwgCiAgICAgICAgICAgIG5hbWVzKFN1cnZleXMpW25hbWVzKFN1cnZleXMpICVsaWtlJSAiQ01TX1swLTldezEsMn0kIl0pClN1cnZleXNMb25nZXIgPC0gbWVsdC5kYXRhLnRhYmxlKFN1cnZleXNbIWlzLm5hKFN1cnZleUlEKSwgLi5jbXNDb2xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJDTVNfIiwgYygxOjMsIDY6OCwgMTA6MTMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OjI4LCAzMCwgMzM6MzQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3OjQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiQ01TX051bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiQ01TX1Jlc3BvbnNlIilbIWlzLm5hKENNU19SZXNwb25zZSldCgpTdXJ2ZXlzTG9uZ2VyWyEoQ01TX051bWJlciAlaW4lIGMoIkNNU18xMiIsICJDTVNfMTgiLCAiQ01TXzIxIiwgIkNNU18yMyIpKV0gJT4lCiAgLlssIENNU19SZXNwb25zZSA6PSBhcy5mYWN0b3IoQ01TX1Jlc3BvbnNlKV0gJT4lCiAgLlssIC5OLCBieSA9IGxpc3QoQ01TX051bWJlciwgQ01TX1Jlc3BvbnNlKV0gJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ01TX051bWJlciwgeSA9IE4sIGZpbGwgPSBmYWN0b3IoQ01TX1Jlc3BvbnNlLCBsZXZlbHMgPSBjKDU6MCkpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKClN1cnZleXNMb25nZXJbKENNU19OdW1iZXIgJWluJSBjKCJDTVNfMTIiLCAiQ01TXzE4IiwgIkNNU18yMSIpKV0gJT4lCiAgLlssIENNU19SZXNwb25zZSA6PSBhcy5mYWN0b3IoQ01TX1Jlc3BvbnNlKV0gJT4lCiAgLlssIC5OLCBieSA9IGxpc3QoQ01TX051bWJlciwgQ01TX1Jlc3BvbnNlKV0gJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ01TX051bWJlciwgeSA9IE4sIGZpbGwgPSBDTVNfUmVzcG9uc2UpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQoKU3VydmV5c0xvbmdlcltDTVNfTnVtYmVyID09ICJDTVNfMjMiXSAlPiUKICAuWywgQ01TX1Jlc3BvbnNlIDo9IGFzLmZhY3RvcihDTVNfUmVzcG9uc2UpXSAlPiUKICAuWywgLk4sIGJ5ID0gbGlzdChDTVNfTnVtYmVyLCBDTVNfUmVzcG9uc2UpXSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDTVNfTnVtYmVyLCB5ID0gTiwgZmlsbCA9IGZhY3RvcihDTVNfUmVzcG9uc2UsIGxldmVscyA9IGMoMTA6MCkpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKYGBge3J9ClJlYWRtaXNzaW9ucyA8LSBmcmVhZCgiL1VzZXJzL2d1c2xpcGtpbi9Eb3dubG9hZHMvRmxvcmlkYSBQb2x5LSBTZW5pb3IgQ2Fwc3RvbmUgR3JvdXAvUmVhZG1pc3Npb25zLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKCmNvbG5hbWVzKFJlYWRtaXNzaW9ucykgPC0gc3RyX3JlcGxhY2VfYWxsKG5hbWVzKFJlYWRtaXNzaW9ucyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAiIikKCmZhY3RvckNvbHMgPC0gYyhuYW1lcyhSZWFkbWlzc2lvbnMpWyEgbmFtZXMoUmVhZG1pc3Npb25zKSAlaW4lIGMoIkluZGV4RGlzY2hEYXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRtaXREYXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRheXNCZXR3ZWVuQWRtc3Npb25zIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRtaXREaXNjaGFyZ2VEYXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRtaXRJbmZvLkFnZSIpXSkKUmVhZG1pc3Npb25zWywgKGZhY3RvckNvbHMpIDo9IGxhcHBseSguU0QsIGFzLmZhY3RvciksIC5TRGNvbHMgPSBmYWN0b3JDb2xzXQoKZGF0ZUNvbHMgPC0gYygiSW5kZXhEaXNjaERhdGUiLCAiUmVhZG1pdERhdGUiLCAiUmVhZG1pdERpc2NoYXJnZURhdGUiKQpkYXRlRnVuIDwtIGZ1bmN0aW9uKHgpIGFzLkRhdGUoeCwgZm9ybWF0ID0gIiVtLyVkLyV5IikKUmVhZG1pc3Npb25zWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKaGVhZChSZWFkbWlzc2lvbnMpCmBgYAoKCmBgYHtyfQpFbmNvdW50ZXJzIDwtIGZyZWFkKCIvVXNlcnMvZ3VzbGlwa2luL0Rvd25sb2Fkcy9GbG9yaWRhIFBvbHktIFNlbmlvciBDYXBzdG9uZSBHcm91cC9FbmNvdW50ZXJzLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKCmNvbG5hbWVzKEVuY291bnRlcnMpIDwtIHN0cl9yZXBsYWNlX2FsbChuYW1lcyhFbmNvdW50ZXJzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIiIpCgpmYWN0b3JDb2xzIDwtIGMobmFtZXMoRW5jb3VudGVycylbISBuYW1lcyhFbmNvdW50ZXJzKSAlaW4lIGMoIkFkbWl0RGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NoYXJnZURhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZ2UiKV0pCkVuY291bnRlcnNbLCAoZmFjdG9yQ29scykgOj0gbGFwcGx5KC5TRCwgYXMuZmFjdG9yKSwgLlNEY29scyA9IGZhY3RvckNvbHNdCgpkYXRlQ29scyA8LSBjKCJBZG1pdERhdGUiLCAiRGlzY2hhcmdlRGF0ZSIpCmRhdGVGdW4gPC0gZnVuY3Rpb24oeCkgYXMuRGF0ZSh4LCBmb3JtYXQgPSAiJW0vJWQvJXkiKQpFbmNvdW50ZXJzWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKRW5jb3VudGVyc1tFbmNvdW50ZXJJRCAlaW4lIGMoIjQwMzQ3IiksIEFnZSA6PSA0M10KRW5jb3VudGVyc1shKEVuY291bnRlcklEICVpbiUgYygiMjI5MjQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzQwMjkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzNTU0NCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQ0NjgzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTYxNTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2ODc1MCIpKSB8IEFnZSA8PSAxMTBdCgpoZWFkKEVuY291bnRlcnMpCmBgYAoKYGBge3J9Cm1lcmdlKEVuY291bnRlcnMsIAogICAgICBtZXJnZShTdXJ2ZXlzLAogICAgICAgICAgICBtZXJnZShDb25uZWN0Q2FsbHMsCiAgICAgICAgICAgICAgICAgIFJlYWRtaXNzaW9ucywKICAgICAgICAgICAgICAgICAgYnkgPSAiRW5jb3VudGVySUQiKSwKICAgICAgICAgICAgYnkgPSAiRW5jb3VudGVySUQiKSwKICAgICAgYnkgPSAiRW5jb3VudGVySUQiKQpgYGAKCg==